//package org.aerie.forest.core.frame.rebar.entity.tool;
//
//import java.util.Optional;
//import java.util.regex.Matcher;
//import java.util.regex.Pattern;
//
//import org.aerie.forest.core.brick.exception.ExceptionGradeEnum;
//import org.aerie.forest.core.brick.exception.ExceptionPack;
//import org.aerie.forest.core.brick.exception.custom.ForestException;
//import org.aerie.forest.core.brick.exception.custom.runtime.AttackedByReflexesException;
//
///**
// * @description forest核心工具类
// *
// * @author quark
// * @organization aerie
// * @date 2020年2月25日 上午1:16:02
// * @version 1.2.0
// */
//public final class ForestCoreTool extends ForestTool {
//
//	/**
//	 * @description 单例
//	 * 
//	 * @author quark
//	 * @date 2020年2月25日 下午11:44:36
//	 * @version 1.2.0
//	 */
//	private static volatile ForestCoreTool forestCoreTool;
//
//	/**
//	 * Construction
//	 * 
//	 *
//	 * @date 2020年2月25日 下午11:44:46
//	 * @version 1.2.0
//	 */
//	private ForestCoreTool() {
//		super("forest核心工具");
//		if (singletonFlag) {
//			throw new AttackedByReflexesException(forestRebarName);
//		}
//		singletonFlag = true;
//		LOGGER.debug(LogMsgPool.INIT_COMPLETE, forestRebarName);
//	}
//
//	/**
//	 * @description 获得单例
//	 * @return forest核心的工具类
//	 *
//	 * @date 2020年2月25日 下午11:48:02
//	 * @version 1.2.0
//	 */
//	protected static ForestCoreTool getInstance() {
//		// 双重锁
//		if (forestCoreTool == null) {
//			synchronized (ForestCoreTool.class) {
//				if (forestCoreTool == null) {
//					forestCoreTool = new ForestCoreTool();
//				}
//			}
//		}
//		return forestCoreTool;
//	}
//
//	/**
//	 * @description 获得异常堆的指定行的堆栈信息
//	 * @param throwable 需要处理的异常
//	 * @param line      行数
//	 * @return 指定行的堆栈信息
//	 * @throws Exception 获取异常堆栈信息失败
//	 *
//	 * @date 2020年2月25日 下午11:50:29
//	 * @version 1.2.0
//	 */
//	public StringBuilder getStackTraceFormatting(Throwable throwable, int line) throws Exception {
//		if (null == throwable) {
//			LOGGER.warn("可抛物为空,无法获得指定行的堆栈信息");
//			return null;
//		}
//		StringBuilder result = new StringBuilder();
//		try {
//			StackTraceElement[] stackTraceElements = Optional.ofNullable(throwable)
//					.orElseThrow(() -> new ForestException("丢失待检测可抛物") {
//
//						/**
//						 * @description 序列化编号
//						 * 
//						 * @author quark
//						 * @date 2020年2月26日 上午12:20:43
//						 */
//						private static final long serialVersionUID = 1L;
//					}).getStackTrace();
//			if (line > stackTraceElements.length || line < -1) {
//				throw new ForestException("获取堆栈异常信息超出范围") {
//
//					/**
//					 * @description 序列化编号
//					 * 
//					 * @author quark说
//					 * @date 2020年2月26日 上午12:21:43
//					 */
//					private static final long serialVersionUID = 1L;
//				};
//			}
//			int index = 0;
//			for (StackTraceElement stackTraceElement : stackTraceElements) {
//				if (line == -1) {
//					result.append(stackTraceElement);
//					result.append("\n");
//				} else if (index++ == line) {
//					result.append(stackTraceElement);
//					result.append("\n");
//					break;
//				}
//			}
//		} catch (Exception e) {
//			throw new ExceptionPack("获取异常堆栈信息失败", ExceptionGradeEnum.WARN, e);
//		}
//		return result;
//	}
//
//	/**
//	 * @description 获取line行后面的堆栈信息【自己new的异常】【共异常包处理器使用】
//	 * @param throwable 需要处理的异常
//	 * @param line      行数
//	 * @return 异常的堆栈信息
//	 * @throws Exception 获取异常堆栈信息失败
//	 *
//	 * @date 2020年2月26日 上午12:24:44
//	 * @version 1.2.0
//	 */
//
//	/**
//	 * @description 获取字符在字符串中第index次出现的位置
//	 * @param string  需要解析的字符串
//	 * @param appoint appoint符号
//	 * @param index   第index出现
//	 * @return 位置
//	 *
//	 * @date 2020年2月27日 上午1:08:32
//	 * @version 1.2.0
//	 */
//	public int getCharacterPosition(String string, String appoint, int index) {
//		// 这里是获取appoint符号的位置
//		Matcher matcher = Pattern.compile(appoint).matcher(string);
//		int num = 0;
//		while (matcher.find()) {
//			num++;
//			// 当appoint符号第index次出现的位置
//			if (num == index) {
//				return matcher.start();
//			}
//		}
//		return -1;
//	}
//}